﻿2026-08-08T19:19:26.0662808Z Current runner version: '2.336.0'
2026-08-08T19:19:26.0684471Z ##[group]Runner Image Provisioner
2026-08-08T19:19:26.0685232Z Hosted Compute Agent
2026-08-08T19:19:26.0685922Z Version: 20260707.563
2026-08-08T19:19:26.0686443Z Commit: 02667638d2b423fbc733a8e32a88b44996a3ba6e
2026-08-08T19:19:26.0687037Z Build Date: 2026-07-07T19:33:50Z
2026-08-08T19:19:26.0687657Z Worker ID: {c83d3627-cf35-4b93-8098-ae7704dbe760}
2026-08-08T19:19:26.0688245Z Azure Region: westus
2026-08-08T19:19:26.0688737Z ##[endgroup]
2026-08-08T19:19:26.0690110Z ##[group]Operating System
2026-08-08T19:19:26.0690665Z Ubuntu
2026-08-08T19:19:26.0691191Z 24.04.4
2026-08-08T19:19:26.0691580Z LTS
2026-08-08T19:19:26.0691986Z ##[endgroup]
2026-08-08T19:19:26.0692493Z ##[group]Runner Image
2026-08-08T19:19:26.0693064Z Image: ubuntu-24.04
2026-08-08T19:19:26.0693560Z Version: 20260720.247.2
2026-08-08T19:19:26.0694548Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260720.247/images/ubuntu/Ubuntu2404-Readme.md
2026-08-08T19:19:26.0695965Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260720.247
2026-08-08T19:19:26.0696779Z ##[endgroup]
2026-08-08T19:19:26.0697719Z ##[group]GITHUB_TOKEN Permissions
2026-08-08T19:19:26.0699273Z Contents: read
2026-08-08T19:19:26.0699816Z Metadata: read
2026-08-08T19:19:26.0700286Z ##[endgroup]
2026-08-08T19:19:26.0701954Z Secret source: Actions
2026-08-08T19:19:26.0702876Z Prepare workflow directory
2026-08-08T19:19:26.1008975Z Prepare all required actions
2026-08-08T19:19:26.1046252Z Getting action download info
2026-08-08T19:19:26.4209988Z Download action repository 'actions/checkout@v4' (SHA:11d5960a326750d5838078e36cf38b85af677262)
2026-08-08T19:19:26.8762637Z Download action repository 'actions/setup-python@v5' (SHA:a26af69be951a213d495a4c3e4e4022e16d87065)
2026-08-08T19:19:27.1065037Z Complete job name: Backend – full suite (minimum 667 tests)
2026-08-08T19:19:27.1762513Z Node 20 is being deprecated. This workflow is running with Node 24 by default. If you need to temporarily use Node 20, you can set the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true environment variable. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
2026-08-08T19:19:27.1769597Z ##[group]Run actions/checkout@v4
2026-08-08T19:19:27.1770150Z with:
2026-08-08T19:19:27.1770493Z   fetch-depth: 0
2026-08-08T19:19:27.1770869Z   repository: Gamexgit/FinanceManager
2026-08-08T19:19:27.1773878Z   token: ***
2026-08-08T19:19:27.1774228Z   ssh-strict: true
2026-08-08T19:19:27.1774580Z   ssh-user: git
2026-08-08T19:19:27.1774933Z   persist-credentials: true
2026-08-08T19:19:27.1775322Z   clean: true
2026-08-08T19:19:27.1775953Z   sparse-checkout-cone-mode: true
2026-08-08T19:19:27.1776395Z   fetch-tags: false
2026-08-08T19:19:27.1776747Z   show-progress: true
2026-08-08T19:19:27.1777099Z   lfs: false
2026-08-08T19:19:27.1777472Z   submodules: false
2026-08-08T19:19:27.1777832Z   set-safe-directory: true
2026-08-08T19:19:27.1778228Z   allow-unsafe-pr-checkout: false
2026-08-08T19:19:27.1778897Z env:
2026-08-08T19:19:27.1779222Z   PYTHONPATH: src
2026-08-08T19:19:27.1779579Z   JARVIS_FINANCE_ENV: test
2026-08-08T19:19:27.1780125Z   JARVIS_FINANCE_DB_PATH: /tmp/financemanager-phase3-backend/finance.sqlite3
2026-08-08T19:19:27.1780864Z   JARVIS_FINANCE_RUNTIME_DIR: /tmp/financemanager-phase3-backend/runtime
2026-08-08T19:19:27.1781450Z   JARVIS_FINANCE_WRITE_MODE: disabled
2026-08-08T19:19:27.1781884Z ##[endgroup]
2026-08-08T19:19:27.2780421Z Syncing repository: Gamexgit/FinanceManager
2026-08-08T19:19:27.2782506Z ##[group]Getting Git version info
2026-08-08T19:19:27.2783443Z Working directory is '/home/runner/work/FinanceManager/FinanceManager'
2026-08-08T19:19:27.2789489Z [command]/usr/bin/git version
2026-08-08T19:19:27.2874723Z git version 2.54.0
2026-08-08T19:19:27.2964759Z ##[endgroup]
2026-08-08T19:19:27.3003439Z Temporarily overriding HOME='/home/runner/work/_temp/ffc02d66-f894-403c-a6c5-b2b33df06788' before making global git config changes
2026-08-08T19:19:27.3006656Z Adding repository directory to the temporary git global config as a safe directory
2026-08-08T19:19:27.3008954Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/FinanceManager/FinanceManager
2026-08-08T19:19:27.3013577Z Deleting the contents of '/home/runner/work/FinanceManager/FinanceManager'
2026-08-08T19:19:27.3016460Z ##[group]Initializing the repository
2026-08-08T19:19:27.3018609Z [command]/usr/bin/git init /home/runner/work/FinanceManager/FinanceManager
2026-08-08T19:19:27.3083669Z hint: Using 'master' as the name for the initial branch. This default branch name
2026-08-08T19:19:27.3085377Z hint: will change to "main" in Git 3.0. To configure the initial branch name
2026-08-08T19:19:27.3088425Z hint: to use in all of your new repositories, which will suppress this warning,
2026-08-08T19:19:27.3089720Z hint: call:
2026-08-08T19:19:27.3090701Z hint:
2026-08-08T19:19:27.3091604Z hint: 	git config --global init.defaultBranch <name>
2026-08-08T19:19:27.3092924Z hint:
2026-08-08T19:19:27.3093921Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
2026-08-08T19:19:27.3095526Z hint: 'development'. The just-created branch can be renamed via this command:
2026-08-08T19:19:27.3097090Z hint:
2026-08-08T19:19:27.3098056Z hint: 	git branch -m <name>
2026-08-08T19:19:27.3098888Z hint:
2026-08-08T19:19:27.3100142Z hint: Disable this message with "git config set advice.defaultBranchName false"
2026-08-08T19:19:27.3101920Z Initialized empty Git repository in /home/runner/work/FinanceManager/FinanceManager/.git/
2026-08-08T19:19:27.3105253Z [command]/usr/bin/git remote add origin https://github.com/Gamexgit/FinanceManager
2026-08-08T19:19:27.3176793Z ##[endgroup]
2026-08-08T19:19:27.3190049Z ##[group]Disabling automatic garbage collection
2026-08-08T19:19:27.3199933Z [command]/usr/bin/git config --local gc.auto 0
2026-08-08T19:19:27.3203198Z ##[endgroup]
2026-08-08T19:19:27.3204595Z ##[group]Setting up auth
2026-08-08T19:19:27.3205981Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-08-08T19:19:27.3236499Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2026-08-08T19:19:27.3614265Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
2026-08-08T19:19:27.3649019Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
2026-08-08T19:19:27.3952095Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
2026-08-08T19:19:27.3984278Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
2026-08-08T19:19:27.4193114Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
2026-08-08T19:19:27.4221715Z ##[endgroup]
2026-08-08T19:19:27.4223525Z ##[group]Fetching the repository
2026-08-08T19:19:27.4232027Z [command]/usr/bin/git -c protocol.version=2 fetch --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +29375c19a23023cc92aae98d7f3c56b59ae72b29:refs/remotes/pull/45/merge
2026-08-08T19:19:28.6837667Z From https://github.com/Gamexgit/FinanceManager
2026-08-08T19:19:28.6841627Z  * [new branch]      Sprint14/twr-xirr-performance-attribution -> origin/Sprint14/twr-xirr-performance-attribution
2026-08-08T19:19:28.6846241Z  * [new branch]      Sprint15/household-import-transfer-reconciliation-v1 -> origin/Sprint15/household-import-transfer-reconciliation-v1
2026-08-08T19:19:28.6849177Z  * [new branch]      Sprint16/hotfix-openpyxl-runtime-dependency -> origin/Sprint16/hotfix-openpyxl-runtime-dependency
2026-08-08T19:19:28.6852138Z  * [new branch]      Sprint16/smart-household-inbox-real-data-onboarding-v2 -> origin/Sprint16/smart-household-inbox-real-data-onboarding-v2
2026-08-08T19:19:28.6855214Z  * [new branch]      feat/budget-analytics-data-explorer-v1   -> origin/feat/budget-analytics-data-explorer-v1
2026-08-08T19:19:28.6858017Z  * [new branch]      feat/budget-categories-duplicates-cleanup -> origin/feat/budget-categories-duplicates-cleanup
2026-08-08T19:19:28.6860318Z  * [new branch]      feat/budget-categories-ux-fix            -> origin/feat/budget-categories-ux-fix
2026-08-08T19:19:28.6862461Z  * [new branch]      feat/budget-import-production-v2         -> origin/feat/budget-import-production-v2
2026-08-08T19:19:28.6865028Z  * [new branch]      feat/budget-monthly-import-rule-learning-v1 -> origin/feat/budget-monthly-import-rule-learning-v1
2026-08-08T19:19:28.6867571Z  * [new branch]      feat/budget-phase-1-4                    -> origin/feat/budget-phase-1-4
2026-08-08T19:19:28.6869743Z  * [new branch]      feat/budget-planning-forecast-v1         -> origin/feat/budget-planning-forecast-v1
2026-08-08T19:19:28.6872040Z  * [new branch]      feat/budget-planning-usability-v2        -> origin/feat/budget-planning-usability-v2
2026-08-08T19:19:28.6874392Z  * [new branch]      feat/budget-review-bulk-assign-confirm   -> origin/feat/budget-review-bulk-assign-confirm
2026-08-08T19:19:28.6876935Z  * [new branch]      feat/budget-workflow-help-ux             -> origin/feat/budget-workflow-help-ux
2026-08-08T19:19:28.6879317Z  * [new branch]      feat/finance-command-center-monthly-close-v1 -> origin/feat/finance-command-center-monthly-close-v1
2026-08-08T19:19:28.6881651Z  * [new branch]      feat/fixed-costs-subscriptions-v1        -> origin/feat/fixed-costs-subscriptions-v1
2026-08-08T19:19:28.6883939Z  * [new branch]      feat/grocery-matching-review-learning-v2 -> origin/feat/grocery-matching-review-learning-v2
2026-08-08T19:19:28.6886738Z  * [new branch]      feat/grocery-product-price-providers-v1  -> origin/feat/grocery-product-price-providers-v1
2026-08-08T19:19:28.6889660Z  * [new branch]      feat/migros-product-savings-grocery-optimizer-v1 -> origin/feat/migros-product-savings-grocery-optimizer-v1
2026-08-08T19:19:28.6892487Z  * [new branch]      feat/mobile-nav-income-csv-final         -> origin/feat/mobile-nav-income-csv-final
2026-08-08T19:19:28.6895011Z  * [new branch]      feat/mobile-nav-income-hotfix-v2         -> origin/feat/mobile-nav-income-hotfix-v2
2026-08-08T19:19:28.6897742Z  * [new branch]      feat/mobile-nav-income-planning-v1       -> origin/feat/mobile-nav-income-planning-v1
2026-08-08T19:19:28.6900200Z  * [new branch]      fix/manual-entry-uat-flows               -> origin/fix/manual-entry-uat-flows
2026-08-08T19:19:28.6902753Z  * [new branch]      fix/sprint16.2-insurance-family-order    -> origin/fix/sprint16.2-insurance-family-order
2026-08-08T19:19:28.6905520Z  * [new branch]      hotfix/sprint13-global-portfolio-aggregation -> origin/hotfix/sprint13-global-portfolio-aggregation
2026-08-08T19:19:28.6908636Z  * [new branch]      hotfix/sprint20-wealth-history-contract  -> origin/hotfix/sprint20-wealth-history-contract
2026-08-08T19:19:28.6911231Z  * [new branch]      hotfix/sprint8-kpi-overflow              -> origin/hotfix/sprint8-kpi-overflow
2026-08-08T19:19:28.6913735Z  * [new branch]      hotfix/sprint8-readonly-render           -> origin/hotfix/sprint8-readonly-render
2026-08-08T19:19:28.6916779Z  * [new branch]      integration/portfolio-phase3-to-main     -> origin/integration/portfolio-phase3-to-main
2026-08-08T19:19:28.6919248Z  * [new branch]      main                                     -> origin/main
2026-08-08T19:19:28.6921364Z  * [new branch]      sprint10/portfolio-go-live               -> origin/sprint10/portfolio-go-live
2026-08-08T19:19:28.6923835Z  * [new branch]      sprint11/portfolio-completeness-ux       -> origin/sprint11/portfolio-completeness-ux
2026-08-08T19:19:28.6926677Z  * [new branch]      sprint12/truewealth-verified-import      -> origin/sprint12/truewealth-verified-import
2026-08-08T19:19:28.6929297Z  * [new branch]      sprint13/postfinance-ledger-import       -> origin/sprint13/postfinance-ledger-import
2026-08-08T19:19:28.6932391Z  * [new branch]      sprint16.1/classification-coverage-import-readiness -> origin/sprint16.1/classification-coverage-import-readiness
2026-08-08T19:19:28.6935940Z  * [new branch]      sprint16.2/first-import-calibration-portal-flow -> origin/sprint16.2/first-import-calibration-portal-flow
2026-08-08T19:19:28.6939266Z  * [new branch]      sprint16.3/import-readiness-batched-decisions-performance -> origin/sprint16.3/import-readiness-batched-decisions-performance
2026-08-08T19:19:28.6942061Z  * [new branch]      sprint17a/data-truth                     -> origin/sprint17a/data-truth
2026-08-08T19:19:28.6944361Z  * [new branch]      sprint17b/equity-quote-refresh           -> origin/sprint17b/equity-quote-refresh
2026-08-08T19:19:28.6947101Z  * [new branch]      sprint17b/household-cockpit              -> origin/sprint17b/household-cockpit
2026-08-08T19:19:28.6949682Z  * [new branch]      sprint17c/data-truth-navigation-today-lite -> origin/sprint17c/data-truth-navigation-today-lite
2026-08-08T19:19:28.6952454Z  * [new branch]      sprint19/prior-year-actuals-simple-budget-v1 -> origin/sprint19/prior-year-actuals-simple-budget-v1
2026-08-08T19:19:28.6955102Z  * [new branch]      sprint2/navigation-design-shell          -> origin/sprint2/navigation-design-shell
2026-08-08T19:19:28.6957888Z  * [new branch]      sprint20/performance-data-readiness-v1   -> origin/sprint20/performance-data-readiness-v1
2026-08-08T19:19:28.6960815Z  * [new branch]      sprint20b/performance-activation-daily-valuations-v1 -> origin/sprint20b/performance-activation-daily-valuations-v1
2026-08-08T19:19:28.6964057Z  * [new branch]      sprint20e/market-data-recovery-crypto-activation-v1 -> origin/sprint20e/market-data-recovery-crypto-activation-v1
2026-08-08T19:19:28.6967520Z  * [new branch]      sprint20e/never-run-status-hotfix        -> origin/sprint20e/never-run-status-hotfix
2026-08-08T19:19:28.6970398Z  * [new branch]      sprint20e/provider-provenance-ui-hotfix  -> origin/sprint20e/provider-provenance-ui-hotfix
2026-08-08T19:19:28.6973386Z  * [new branch]      sprint20f/truewealth-first-performance-activation -> origin/sprint20f/truewealth-first-performance-activation
2026-08-08T19:19:28.6976671Z  * [new branch]      sprint3.1/reconciliation-semantic-hardening -> origin/sprint3.1/reconciliation-semantic-hardening
2026-08-08T19:19:28.6979528Z  * [new branch]      sprint3/reconciliation-snapshot-foundation -> origin/sprint3/reconciliation-snapshot-foundation
2026-08-08T19:19:28.6982304Z  * [new branch]      sprint4.1/portfolio-policy-contract-hardening -> origin/sprint4.1/portfolio-policy-contract-hardening
2026-08-08T19:19:28.6984972Z  * [new branch]      sprint4/portfolio-policy-foundation      -> origin/sprint4/portfolio-policy-foundation
2026-08-08T19:19:28.6987836Z  * [new branch]      sprint5/portfolio-performance-foundation -> origin/sprint5/portfolio-performance-foundation
2026-08-08T19:19:28.6990805Z  * [new branch]      sprint6/portfolio-data-ingestion-reconciliation -> origin/sprint6/portfolio-data-ingestion-reconciliation
2026-08-08T19:19:28.6993560Z  * [new branch]      sprint7/postfinance-portfolio-source     -> origin/sprint7/postfinance-portfolio-source
2026-08-08T19:19:28.6996323Z  * [new branch]      sprint8/market-fx-benchmark-risk         -> origin/sprint8/market-fx-benchmark-risk
2026-08-08T19:19:28.6999098Z  * [new branch]      sprint9/portfolio-basis-policy           -> origin/sprint9/portfolio-basis-policy
2026-08-08T19:19:28.7001270Z  * [new tag]         v0.3.0                                   -> v0.3.0
2026-08-08T19:19:28.7002838Z  * [new tag]         v0.3.1                                   -> v0.3.1
2026-08-08T19:19:28.7004410Z  * [new tag]         v0.3.2                                   -> v0.3.2
2026-08-08T19:19:28.7006321Z  * [new ref]         29375c19a23023cc92aae98d7f3c56b59ae72b29 -> pull/45/merge
2026-08-08T19:19:28.7010835Z ##[endgroup]
2026-08-08T19:19:28.7012581Z ##[group]Determining the checkout info
2026-08-08T19:19:28.7014860Z ##[endgroup]
2026-08-08T19:19:28.7016445Z [command]/usr/bin/git sparse-checkout disable
2026-08-08T19:19:28.7059995Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
2026-08-08T19:19:28.7098860Z ##[group]Checking out the ref
2026-08-08T19:19:28.7108697Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/45/merge
2026-08-08T19:19:28.7582859Z Note: switching to 'refs/remotes/pull/45/merge'.
2026-08-08T19:19:28.7596574Z 
2026-08-08T19:19:28.7598580Z You are in 'detached HEAD' state. You can look around, make experimental
2026-08-08T19:19:28.7608957Z changes and commit them, and you can discard any commits you make in this
2026-08-08T19:19:28.7618692Z state without impacting any branches by switching back to a branch.
2026-08-08T19:19:28.7626496Z 
2026-08-08T19:19:28.7627531Z If you want to create a new branch to retain commits you create, you may
2026-08-08T19:19:28.7629341Z do so (now or later) by using -c with the switch command. Example:
2026-08-08T19:19:28.7630589Z 
2026-08-08T19:19:28.7631302Z   git switch -c <new-branch-name>
2026-08-08T19:19:28.7632156Z 
2026-08-08T19:19:28.7632773Z Or undo this operation with:
2026-08-08T19:19:28.7633634Z 
2026-08-08T19:19:28.7634286Z   git switch -
2026-08-08T19:19:28.7635079Z 
2026-08-08T19:19:28.7636283Z Turn off this advice by setting config variable advice.detachedHead to false
2026-08-08T19:19:28.7637515Z 
2026-08-08T19:19:28.7638845Z HEAD is now at 29375c1 Merge fc61b2315ce6c84101999afdba38a40b2bd82e77 into a9609cecbda474355f02a20a286214195cad1df3
2026-08-08T19:19:28.7643496Z ##[endgroup]
2026-08-08T19:19:28.7647446Z [command]/usr/bin/git log -1 --format=%H
2026-08-08T19:19:28.7674995Z 29375c19a23023cc92aae98d7f3c56b59ae72b29
2026-08-08T19:19:28.8023368Z Node 20 is being deprecated. This workflow is running with Node 24 by default. If you need to temporarily use Node 20, you can set the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true environment variable. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
2026-08-08T19:19:28.8028457Z ##[group]Run actions/setup-python@v5
2026-08-08T19:19:28.8029586Z with:
2026-08-08T19:19:28.8030529Z   python-version: 3.11
2026-08-08T19:19:28.8031571Z   cache: pip
2026-08-08T19:19:28.8032589Z   cache-dependency-path: requirements-ci.txt
2026-08-08T19:19:28.8033818Z   check-latest: false
2026-08-08T19:19:28.8040247Z   token: ***
2026-08-08T19:19:28.8041283Z   update-environment: true
2026-08-08T19:19:28.8042415Z   allow-prereleases: false
2026-08-08T19:19:28.8043523Z   freethreaded: false
2026-08-08T19:19:28.8044533Z env:
2026-08-08T19:19:28.8045461Z   PYTHONPATH: src
2026-08-08T19:19:28.8046657Z   JARVIS_FINANCE_ENV: test
2026-08-08T19:19:28.8048149Z   JARVIS_FINANCE_DB_PATH: /tmp/financemanager-phase3-backend/finance.sqlite3
2026-08-08T19:19:28.8049951Z   JARVIS_FINANCE_RUNTIME_DIR: /tmp/financemanager-phase3-backend/runtime
2026-08-08T19:19:28.8051491Z   JARVIS_FINANCE_WRITE_MODE: disabled
2026-08-08T19:19:28.8052712Z ##[endgroup]
2026-08-08T19:19:28.9189874Z ##[group]Installed versions
2026-08-08T19:19:28.9746458Z (node:1930) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
2026-08-08T19:19:28.9748801Z Successfully set up CPython (3.11.15)
2026-08-08T19:19:28.9750456Z (Use `node --trace-deprecation ...` to show where the warning was created)
2026-08-08T19:19:28.9752995Z ##[endgroup]
2026-08-08T19:19:29.0550906Z [command]/opt/hostedtoolcache/Python/3.11.15/x64/bin/pip cache dir
2026-08-08T19:19:29.7459084Z /home/runner/.cache/pip
2026-08-08T19:19:30.0042106Z pip cache is not found
2026-08-08T19:19:30.0140133Z ##[group]Run python -m pip install -e . -r requirements-ci.txt
2026-08-08T19:19:30.0140568Z [36;1mpython -m pip install -e . -r requirements-ci.txt[0m
2026-08-08T19:19:30.0186862Z shell: /usr/bin/bash -e {0}
2026-08-08T19:19:30.0187085Z env:
2026-08-08T19:19:30.0187262Z   PYTHONPATH: src
2026-08-08T19:19:30.0187445Z   JARVIS_FINANCE_ENV: test
2026-08-08T19:19:30.0187939Z   JARVIS_FINANCE_DB_PATH: /tmp/financemanager-phase3-backend/finance.sqlite3
2026-08-08T19:19:30.0188344Z   JARVIS_FINANCE_RUNTIME_DIR: /tmp/financemanager-phase3-backend/runtime
2026-08-08T19:19:30.0188650Z   JARVIS_FINANCE_WRITE_MODE: disabled
2026-08-08T19:19:30.0188922Z   pythonLocation: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:19:30.0189266Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.11.15/x64/lib/pkgconfig
2026-08-08T19:19:30.0189619Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:19:30.0189930Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:19:30.0190270Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:19:30.0190589Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.15/x64/lib
2026-08-08T19:19:30.0190857Z ##[endgroup]
2026-08-08T19:19:31.1284137Z Obtaining file:///home/runner/work/FinanceManager/FinanceManager
2026-08-08T19:19:31.1299395Z   Installing build dependencies: started
2026-08-08T19:19:32.1437114Z   Installing build dependencies: finished with status 'done'
2026-08-08T19:19:32.1443371Z   Checking if build backend supports build_editable: started
2026-08-08T19:19:32.4647171Z   Checking if build backend supports build_editable: finished with status 'done'
2026-08-08T19:19:32.4652378Z   Getting requirements to build editable: started
2026-08-08T19:19:32.7226944Z   Getting requirements to build editable: finished with status 'done'
2026-08-08T19:19:32.7236470Z   Preparing editable metadata (pyproject.toml): started
2026-08-08T19:19:32.8642699Z   Preparing editable metadata (pyproject.toml): finished with status 'done'
2026-08-08T19:19:33.0039023Z Collecting fastapi==0.136.1 (from -r requirements-ci.txt (line 1))
2026-08-08T19:19:33.0431545Z   Downloading fastapi-0.136.1-py3-none-any.whl.metadata (28 kB)
2026-08-08T19:19:33.0646133Z Collecting httpx==0.28.1 (from -r requirements-ci.txt (line 2))
2026-08-08T19:19:33.0686558Z   Downloading httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB)
2026-08-08T19:19:33.0815525Z Collecting Jinja2==3.1.6 (from -r requirements-ci.txt (line 3))
2026-08-08T19:19:33.0844184Z   Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)
2026-08-08T19:19:33.0996516Z Collecting openpyxl==3.1.5 (from -r requirements-ci.txt (line 4))
2026-08-08T19:19:33.1026391Z   Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)
2026-08-08T19:19:33.2436832Z Collecting pandas==3.0.3 (from -r requirements-ci.txt (line 5))
2026-08-08T19:19:33.2473477Z   Downloading pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (79 kB)
2026-08-08T19:19:33.3017379Z Collecting plotly==6.7.0 (from -r requirements-ci.txt (line 6))
2026-08-08T19:19:33.3051405Z   Downloading plotly-6.7.0-py3-none-any.whl.metadata (8.6 kB)
2026-08-08T19:19:33.3713078Z Collecting pydantic==2.13.4 (from -r requirements-ci.txt (line 7))
2026-08-08T19:19:33.3743332Z   Downloading pydantic-2.13.4-py3-none-any.whl.metadata (109 kB)
2026-08-08T19:19:33.3912370Z Collecting pypdf==6.14.2 (from -r requirements-ci.txt (line 8))
2026-08-08T19:19:33.3938757Z   Downloading pypdf-6.14.2-py3-none-any.whl.metadata (7.2 kB)
2026-08-08T19:19:33.5010403Z Collecting pytest==9.0.2 (from -r requirements-ci.txt (line 9))
2026-08-08T19:19:33.5044726Z   Downloading pytest-9.0.2-py3-none-any.whl.metadata (7.6 kB)
2026-08-08T19:19:33.7216710Z Collecting ruff==0.15.13 (from -r requirements-ci.txt (line 10))
2026-08-08T19:19:33.7259718Z   Downloading ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (26 kB)
2026-08-08T19:19:33.7613700Z Collecting streamlit==1.57.0 (from -r requirements-ci.txt (line 11))
2026-08-08T19:19:33.7654755Z   Downloading streamlit-1.57.0-py3-none-any.whl.metadata (9.6 kB)
2026-08-08T19:19:33.8009495Z Collecting uvicorn==0.47.0 (from -r requirements-ci.txt (line 12))
2026-08-08T19:19:33.8062571Z   Downloading uvicorn-0.47.0-py3-none-any.whl.metadata (6.7 kB)
2026-08-08T19:19:33.8148369Z Collecting xlrd==2.0.2 (from -r requirements-ci.txt (line 13))
2026-08-08T19:19:33.8187390Z   Downloading xlrd-2.0.2-py2.py3-none-any.whl.metadata (3.5 kB)
2026-08-08T19:19:33.8354109Z Collecting yfinance==1.3.0 (from -r requirements-ci.txt (line 14))
2026-08-08T19:19:33.8381164Z   Downloading yfinance-1.3.0-py2.py3-none-any.whl.metadata (6.1 kB)
2026-08-08T19:19:33.8561086Z Collecting starlette>=0.46.0 (from fastapi==0.136.1->-r requirements-ci.txt (line 1))
2026-08-08T19:19:33.8598789Z   Downloading starlette-1.6.0-py3-none-any.whl.metadata (6.4 kB)
2026-08-08T19:19:33.8716454Z Collecting typing-extensions>=4.8.0 (from fastapi==0.136.1->-r requirements-ci.txt (line 1))
2026-08-08T19:19:33.8746507Z   Downloading typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB)
2026-08-08T19:19:33.9113778Z Collecting typing-inspection>=0.4.2 (from fastapi==0.136.1->-r requirements-ci.txt (line 1))
2026-08-08T19:19:33.9142239Z   Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB)
2026-08-08T19:19:33.9258487Z Collecting annotated-doc>=0.0.2 (from fastapi==0.136.1->-r requirements-ci.txt (line 1))
2026-08-08T19:19:33.9287923Z   Downloading annotated_doc-0.0.5-py3-none-any.whl.metadata (6.5 kB)
2026-08-08T19:19:33.9499630Z Collecting anyio (from httpx==0.28.1->-r requirements-ci.txt (line 2))
2026-08-08T19:19:33.9527127Z   Downloading anyio-4.14.2-py3-none-any.whl.metadata (4.6 kB)
2026-08-08T19:19:33.9654794Z Collecting certifi (from httpx==0.28.1->-r requirements-ci.txt (line 2))
2026-08-08T19:19:33.9683128Z   Downloading certifi-2026.7.22-py3-none-any.whl.metadata (2.5 kB)
2026-08-08T19:19:33.9793038Z Collecting httpcore==1.* (from httpx==0.28.1->-r requirements-ci.txt (line 2))
2026-08-08T19:19:33.9820892Z   Downloading httpcore-1.0.9-py3-none-any.whl.metadata (21 kB)
2026-08-08T19:19:34.0122498Z Collecting idna (from httpx==0.28.1->-r requirements-ci.txt (line 2))
2026-08-08T19:19:34.0148684Z   Downloading idna-3.18-py3-none-any.whl.metadata (6.1 kB)
2026-08-08T19:19:34.0511178Z Collecting MarkupSafe>=2.0 (from Jinja2==3.1.6->-r requirements-ci.txt (line 3))
2026-08-08T19:19:34.0540455Z   Downloading markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB)
2026-08-08T19:19:34.0989806Z Collecting et-xmlfile (from openpyxl==3.1.5->-r requirements-ci.txt (line 4))
2026-08-08T19:19:34.1022898Z   Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)
2026-08-08T19:19:34.2648144Z Collecting numpy>=1.26.0 (from pandas==3.0.3->-r requirements-ci.txt (line 5))
2026-08-08T19:19:34.2685468Z   Downloading numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (6.6 kB)
2026-08-08T19:19:34.2781811Z Collecting python-dateutil>=2.8.2 (from pandas==3.0.3->-r requirements-ci.txt (line 5))
2026-08-08T19:19:34.2810977Z   Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
2026-08-08T19:19:34.3037011Z Collecting narwhals>=1.15.1 (from plotly==6.7.0->-r requirements-ci.txt (line 6))
2026-08-08T19:19:34.3064289Z   Downloading narwhals-2.24.0-py3-none-any.whl.metadata (15 kB)
2026-08-08T19:19:34.3734533Z Collecting packaging (from plotly==6.7.0->-r requirements-ci.txt (line 6))
2026-08-08T19:19:34.3767353Z   Downloading packaging-26.3-py3-none-any.whl.metadata (3.5 kB)
2026-08-08T19:19:34.3856039Z Collecting annotated-types>=0.6.0 (from pydantic==2.13.4->-r requirements-ci.txt (line 7))
2026-08-08T19:19:34.3882277Z   Downloading annotated_types-0.8.0-py3-none-any.whl.metadata (15 kB)
2026-08-08T19:19:34.8208571Z Collecting pydantic-core==2.46.4 (from pydantic==2.13.4->-r requirements-ci.txt (line 7))
2026-08-08T19:19:34.8240581Z   Downloading pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)
2026-08-08T19:19:35.0987815Z Collecting iniconfig>=1.0.1 (from pytest==9.0.2->-r requirements-ci.txt (line 9))
2026-08-08T19:19:35.1014336Z   Downloading iniconfig-2.3.0-py3-none-any.whl.metadata (2.5 kB)
2026-08-08T19:19:35.1331035Z Collecting pluggy<2,>=1.5 (from pytest==9.0.2->-r requirements-ci.txt (line 9))
2026-08-08T19:19:35.1359366Z   Downloading pluggy-1.6.0-py3-none-any.whl.metadata (4.8 kB)
2026-08-08T19:19:35.3648350Z Collecting pygments>=2.7.2 (from pytest==9.0.2->-r requirements-ci.txt (line 9))
2026-08-08T19:19:35.3678787Z   Downloading pygments-2.20.0-py3-none-any.whl.metadata (2.5 kB)
2026-08-08T19:19:35.4039454Z Collecting altair!=5.4.0,!=5.4.1,<7,>=4.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.4067381Z   Downloading altair-6.2.2-py3-none-any.whl.metadata (11 kB)
2026-08-08T19:19:35.4172467Z Collecting blinker<2,>=1.5.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.4201072Z   Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB)
2026-08-08T19:19:35.4324338Z Collecting cachetools<8,>=5.5 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.4352171Z   Downloading cachetools-7.1.7-py3-none-any.whl.metadata (5.5 kB)
2026-08-08T19:19:35.5906620Z Collecting click<9,>=7.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.5936889Z   Downloading click-8.4.2-py3-none-any.whl.metadata (2.6 kB)
2026-08-08T19:19:35.7249411Z Collecting gitpython!=3.1.19,<4,>=3.0.7 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.7278138Z   Downloading gitpython-3.1.58-py3-none-any.whl.metadata (13 kB)
2026-08-08T19:19:35.8353635Z Collecting pillow<13,>=7.1.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.8385894Z   Downloading pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (9.1 kB)
2026-08-08T19:19:35.8593681Z Collecting pydeck<1,>=0.8.0b4 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.8620864Z   Downloading pydeck-0.9.3-py2.py3-none-any.whl.metadata (4.2 kB)
2026-08-08T19:19:35.9749284Z Collecting protobuf<8,>=3.20 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:35.9781102Z   Downloading protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl.metadata (595 bytes)
2026-08-08T19:19:36.2687478Z Collecting pyarrow>=7.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.2715983Z   Downloading pyarrow-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (3.0 kB)
2026-08-08T19:19:36.2860031Z Collecting requests<3,>=2.27 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.2889252Z   Downloading requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
2026-08-08T19:19:36.2999164Z Collecting tenacity<10,>=8.1.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.3028831Z   Downloading tenacity-9.1.4-py3-none-any.whl.metadata (1.2 kB)
2026-08-08T19:19:36.3424979Z Collecting toml<2,>=0.10.1 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.3452038Z   Downloading toml-0.10.2-py2.py3-none-any.whl.metadata (7.1 kB)
2026-08-08T19:19:36.3686548Z Collecting httptools>=0.6.3 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.3713125Z   Downloading httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (3.5 kB)
2026-08-08T19:19:36.3817313Z Collecting python-multipart>=0.0.10 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.3843793Z   Downloading python_multipart-0.0.32-py3-none-any.whl.metadata (2.1 kB)
2026-08-08T19:19:36.4470970Z Collecting websockets>=12.0.0 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.4502719Z   Downloading websockets-17.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (6.3 kB)
2026-08-08T19:19:36.4830727Z Collecting itsdangerous>=2.1.2 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.4861843Z   Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB)
2026-08-08T19:19:36.5130217Z Collecting watchdog<7,>=2.1.5 (from streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:36.5160110Z   Downloading watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl.metadata (44 kB)
2026-08-08T19:19:36.9666772Z Collecting h11>=0.8 (from uvicorn==0.47.0->-r requirements-ci.txt (line 12))
2026-08-08T19:19:36.9692154Z   Downloading h11-0.16.0-py3-none-any.whl.metadata (8.3 kB)
2026-08-08T19:19:37.2903576Z Collecting multitasking>=0.0.7 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.2930776Z   Downloading multitasking-0.0.13-py3-none-any.whl.metadata (16 kB)
2026-08-08T19:19:37.3060984Z Collecting platformdirs>=2.0.0 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.3089780Z   Downloading platformdirs-4.11.1-py3-none-any.whl.metadata (5.5 kB)
2026-08-08T19:19:37.3551854Z Collecting pytz>=2022.5 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.3583379Z   Downloading pytz-2026.3.post1-py2.py3-none-any.whl.metadata (22 kB)
2026-08-08T19:19:37.3849179Z Collecting frozendict>=2.3.4 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.3887549Z   Downloading frozendict-2.4.7-py3-none-any.whl.metadata (23 kB)
2026-08-08T19:19:37.4763891Z Collecting peewee>=3.16.2 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.4792030Z   Downloading peewee-4.3.0-py3-none-any.whl.metadata (10 kB)
2026-08-08T19:19:37.5026730Z Collecting beautifulsoup4>=4.11.1 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.5053902Z   Downloading beautifulsoup4-4.15.0-py3-none-any.whl.metadata (3.8 kB)
2026-08-08T19:19:37.5417511Z Collecting curl_cffi>=0.15 (from yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:37.5445209Z   Downloading curl_cffi-0.16.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (17 kB)
2026-08-08T19:19:37.6860222Z Collecting jsonschema>=3.0 (from altair!=5.4.0,!=5.4.1,<7,>=4.0->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:37.6886321Z   Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB)
2026-08-08T19:19:37.7062216Z Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:37.7096444Z   Downloading gitdb-4.0.12-py3-none-any.whl.metadata (1.2 kB)
2026-08-08T19:19:37.7183194Z Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:37.7211770Z   Downloading smmap-5.0.3-py3-none-any.whl.metadata (4.6 kB)
2026-08-08T19:19:37.7938747Z Collecting charset_normalizer<4,>=2 (from requests<3,>=2.27->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:37.7971128Z   Downloading charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (41 kB)
2026-08-08T19:19:38.0127024Z Collecting urllib3<3,>=1.26 (from requests<3,>=2.27->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:38.0158312Z   Downloading urllib3-2.7.0-py3-none-any.whl.metadata (6.9 kB)
2026-08-08T19:19:38.0358990Z Collecting soupsieve>=1.6.1 (from beautifulsoup4>=4.11.1->yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:38.0385443Z   Downloading soupsieve-2.9.2-py3-none-any.whl.metadata (4.6 kB)
2026-08-08T19:19:38.1837711Z Collecting cffi>=2.0.0 (from curl_cffi>=0.15->yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:38.1866275Z   Downloading cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.5 kB)
2026-08-08T19:19:38.1997456Z Collecting pycparser (from cffi>=2.0.0->curl_cffi>=0.15->yfinance==1.3.0->-r requirements-ci.txt (line 14))
2026-08-08T19:19:38.2022650Z   Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB)
2026-08-08T19:19:38.2145916Z Collecting attrs>=22.2.0 (from jsonschema>=3.0->altair!=5.4.0,!=5.4.1,<7,>=4.0->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:38.2172975Z   Downloading attrs-26.1.0-py3-none-any.whl.metadata (8.8 kB)
2026-08-08T19:19:38.2317840Z Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=3.0->altair!=5.4.0,!=5.4.1,<7,>=4.0->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:38.2350112Z   Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB)
2026-08-08T19:19:38.3062769Z Collecting referencing>=0.28.4 (from jsonschema>=3.0->altair!=5.4.0,!=5.4.1,<7,>=4.0->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:38.3088660Z   Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB)
2026-08-08T19:19:38.7591745Z Collecting rpds-py>=0.25.0 (from jsonschema>=3.0->altair!=5.4.0,!=5.4.1,<7,>=4.0->streamlit==1.57.0->-r requirements-ci.txt (line 11))
2026-08-08T19:19:38.7622842Z   Downloading rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB)
2026-08-08T19:19:39.0012893Z Collecting six>=1.5 (from python-dateutil>=2.8.2->pandas==3.0.3->-r requirements-ci.txt (line 5))
2026-08-08T19:19:39.0040762Z   Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
2026-08-08T19:19:39.0205821Z Downloading fastapi-0.136.1-py3-none-any.whl (117 kB)
2026-08-08T19:19:39.0261428Z Downloading httpx-0.28.1-py3-none-any.whl (73 kB)
2026-08-08T19:19:39.0310551Z Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
2026-08-08T19:19:39.0359953Z Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)
2026-08-08T19:19:39.0436311Z Downloading pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (11.3 MB)
2026-08-08T19:19:39.2247682Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.3/11.3 MB 61.6 MB/s  0:00:00
2026-08-08T19:19:39.2287705Z Downloading plotly-6.7.0-py3-none-any.whl (9.9 MB)
2026-08-08T19:19:39.5014188Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.9/9.9 MB 35.6 MB/s  0:00:00
2026-08-08T19:19:39.5047022Z Downloading pydantic-2.13.4-py3-none-any.whl (472 kB)
2026-08-08T19:19:39.5172406Z Downloading pypdf-6.14.2-py3-none-any.whl (349 kB)
2026-08-08T19:19:39.6333488Z Downloading pytest-9.0.2-py3-none-any.whl (374 kB)
2026-08-08T19:19:39.6415231Z Downloading ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.4 MB)
2026-08-08T19:19:39.8247844Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.4/11.4 MB 62.1 MB/s  0:00:00
2026-08-08T19:19:39.8281727Z Downloading streamlit-1.57.0-py3-none-any.whl (9.2 MB)
2026-08-08T19:19:39.9514969Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2/9.2 MB 74.3 MB/s  0:00:00
2026-08-08T19:19:39.9535185Z Downloading uvicorn-0.47.0-py3-none-any.whl (71 kB)
2026-08-08T19:19:39.9595017Z Downloading xlrd-2.0.2-py2.py3-none-any.whl (96 kB)
2026-08-08T19:19:39.9741837Z Downloading yfinance-1.3.0-py2.py3-none-any.whl (133 kB)
2026-08-08T19:19:39.9793043Z Downloading pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)
2026-08-08T19:19:40.0037102Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 81.2 MB/s  0:00:00
2026-08-08T19:19:40.0064793Z Downloading altair-6.2.2-py3-none-any.whl (797 kB)
2026-08-08T19:19:40.1441835Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 797.6/797.6 kB 4.0 MB/s  0:00:00
2026-08-08T19:19:40.1471649Z Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB)
2026-08-08T19:19:40.1518795Z Downloading cachetools-7.1.7-py3-none-any.whl (16 kB)
2026-08-08T19:19:40.1562672Z Downloading click-8.4.2-py3-none-any.whl (119 kB)
2026-08-08T19:19:40.1611295Z Downloading gitpython-3.1.58-py3-none-any.whl (220 kB)
2026-08-08T19:19:40.1959134Z Downloading gitdb-4.0.12-py3-none-any.whl (62 kB)
2026-08-08T19:19:40.2008477Z Downloading httpcore-1.0.9-py3-none-any.whl (78 kB)
2026-08-08T19:19:40.2056191Z Downloading numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.9 MB)
2026-08-08T19:19:40.4528889Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.9/16.9 MB 68.1 MB/s  0:00:00
2026-08-08T19:19:40.4563353Z Downloading pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.9 MB)
2026-08-08T19:19:40.6621707Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.9/6.9 MB 33.0 MB/s  0:00:00
2026-08-08T19:19:40.6653638Z Downloading pluggy-1.6.0-py3-none-any.whl (20 kB)
2026-08-08T19:19:40.6713291Z Downloading protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl (327 kB)
2026-08-08T19:19:40.6780468Z Downloading pydeck-0.9.3-py2.py3-none-any.whl (11.4 MB)
2026-08-08T19:19:41.0224105Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.4/11.4 MB 32.6 MB/s  0:00:00
2026-08-08T19:19:41.0254679Z Downloading requests-2.34.2-py3-none-any.whl (73 kB)
2026-08-08T19:19:41.0490935Z Downloading charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (221 kB)
2026-08-08T19:19:41.0823713Z Downloading idna-3.18-py3-none-any.whl (65 kB)
2026-08-08T19:19:41.2674510Z Downloading smmap-5.0.3-py3-none-any.whl (24 kB)
2026-08-08T19:19:41.2723215Z Downloading tenacity-9.1.4-py3-none-any.whl (28 kB)
2026-08-08T19:19:41.2768000Z Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
2026-08-08T19:19:41.2811549Z Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB)
2026-08-08T19:19:41.2855215Z Downloading urllib3-2.7.0-py3-none-any.whl (131 kB)
2026-08-08T19:19:41.2899981Z Downloading watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl (79 kB)
2026-08-08T19:19:41.2945261Z Downloading annotated_doc-0.0.5-py3-none-any.whl (5.3 kB)
2026-08-08T19:19:41.2987366Z Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB)
2026-08-08T19:19:41.3030439Z Downloading anyio-4.14.2-py3-none-any.whl (125 kB)
2026-08-08T19:19:41.3189811Z Downloading beautifulsoup4-4.15.0-py3-none-any.whl (109 kB)
2026-08-08T19:19:41.3234692Z Downloading certifi-2026.7.22-py3-none-any.whl (136 kB)
2026-08-08T19:19:41.3281522Z Downloading curl_cffi-0.16.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (13.5 MB)
2026-08-08T19:19:41.5233975Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.5/13.5 MB 69.5 MB/s  0:00:00
2026-08-08T19:19:41.5270487Z Downloading cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (217 kB)
2026-08-08T19:19:41.5322035Z Downloading frozendict-2.4.7-py3-none-any.whl (16 kB)
2026-08-08T19:19:41.5374274Z Downloading h11-0.16.0-py3-none-any.whl (37 kB)
2026-08-08T19:19:41.5422892Z Downloading httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (464 kB)
2026-08-08T19:19:41.5476273Z Downloading iniconfig-2.3.0-py3-none-any.whl (7.5 kB)
2026-08-08T19:19:41.5557127Z Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB)
2026-08-08T19:19:41.6621897Z Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB)
2026-08-08T19:19:41.6670774Z Downloading attrs-26.1.0-py3-none-any.whl (67 kB)
2026-08-08T19:19:41.6716504Z Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB)
2026-08-08T19:19:41.6760470Z Downloading markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB)
2026-08-08T19:19:41.6817673Z Downloading multitasking-0.0.13-py3-none-any.whl (16 kB)
2026-08-08T19:19:41.6867480Z Downloading narwhals-2.24.0-py3-none-any.whl (461 kB)
2026-08-08T19:19:41.6923333Z Downloading packaging-26.3-py3-none-any.whl (129 kB)
2026-08-08T19:19:41.7026001Z Downloading peewee-4.3.0-py3-none-any.whl (179 kB)
2026-08-08T19:19:41.7075141Z Downloading platformdirs-4.11.1-py3-none-any.whl (23 kB)
2026-08-08T19:19:41.7124931Z Downloading pyarrow-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl (50.1 MB)
2026-08-08T19:19:42.6103410Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.1/50.1 MB 55.7 MB/s  0:00:00
2026-08-08T19:19:42.6136506Z Downloading pygments-2.20.0-py3-none-any.whl (1.2 MB)
2026-08-08T19:19:42.6462260Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 33.0 MB/s  0:00:00
2026-08-08T19:19:42.6486458Z Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
2026-08-08T19:19:42.6527442Z Downloading python_multipart-0.0.32-py3-none-any.whl (30 kB)
2026-08-08T19:19:42.6571460Z Downloading pytz-2026.3.post1-py2.py3-none-any.whl (508 kB)
2026-08-08T19:19:42.6639231Z Downloading referencing-0.37.0-py3-none-any.whl (26 kB)
2026-08-08T19:19:42.6755151Z Downloading rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (371 kB)
2026-08-08T19:19:42.8143578Z Downloading six-1.17.0-py2.py3-none-any.whl (11 kB)
2026-08-08T19:19:42.9903114Z Downloading soupsieve-2.9.2-py3-none-any.whl (37 kB)
2026-08-08T19:19:42.9950700Z Downloading starlette-1.6.0-py3-none-any.whl (75 kB)
2026-08-08T19:19:42.9999868Z Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB)
2026-08-08T19:19:43.2528775Z Downloading websockets-17.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (219 kB)
2026-08-08T19:19:43.2573302Z Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)
2026-08-08T19:19:43.2617011Z Downloading pycparser-3.0-py3-none-any.whl (48 kB)
2026-08-08T19:19:43.4518116Z Building wheels for collected packages: jarvis-finance
2026-08-08T19:19:43.4525738Z   Building editable for jarvis-finance (pyproject.toml): started
2026-08-08T19:19:43.6217111Z   Building editable for jarvis-finance (pyproject.toml): finished with status 'done'
2026-08-08T19:19:43.6237131Z   Created wheel for jarvis-finance: filename=jarvis_finance-0.1.0-0.editable-py3-none-any.whl size=1510 sha256=4c3ec45bb8815c1c6295eb601a0c5b81e92ee9e2a3f41f5595c2caab5dd84a73
2026-08-08T19:19:43.6238756Z   Stored in directory: /tmp/pip-ephem-wheel-cache-_coz1a1y/wheels/ad/81/a6/5383a3c32505f4e59976cc011a336e07c6284dcaf35f5a7ea5
2026-08-08T19:19:43.6239761Z Successfully built jarvis-finance
2026-08-08T19:19:43.7185411Z Installing collected packages: pytz, multitasking, xlrd, websockets, watchdog, urllib3, typing-extensions, toml, tenacity, soupsieve, smmap, six, ruff, rpds-py, python-multipart, pypdf, pygments, pycparser, pyarrow, protobuf, pluggy, platformdirs, pillow, peewee, packaging, numpy, narwhals, MarkupSafe, itsdangerous, iniconfig, idna, httptools, h11, frozendict, et-xmlfile, click, charset_normalizer, certifi, cachetools, blinker, attrs, annotated-types, annotated-doc, uvicorn, typing-inspection, requests, referencing, python-dateutil, pytest, pydantic-core, plotly, openpyxl, Jinja2, httpcore, gitdb, cffi, beautifulsoup4, anyio, starlette, pydeck, pydantic, pandas, jsonschema-specifications, jarvis-finance, httpx, gitpython, curl_cffi, yfinance, jsonschema, fastapi, altair, streamlit
2026-08-08T19:20:00.0956309Z 
2026-08-08T19:20:00.0976842Z Successfully installed Jinja2-3.1.6 MarkupSafe-3.0.3 altair-6.2.2 annotated-doc-0.0.5 annotated-types-0.8.0 anyio-4.14.2 attrs-26.1.0 beautifulsoup4-4.15.0 blinker-1.9.0 cachetools-7.1.7 certifi-2026.7.22 cffi-2.1.1 charset_normalizer-3.4.9 click-8.4.2 curl_cffi-0.16.0 et-xmlfile-2.0.0 fastapi-0.136.1 frozendict-2.4.7 gitdb-4.0.12 gitpython-3.1.58 h11-0.16.0 httpcore-1.0.9 httptools-0.8.0 httpx-0.28.1 idna-3.18 iniconfig-2.3.0 itsdangerous-2.2.0 jarvis-finance-0.1.0 jsonschema-4.26.0 jsonschema-specifications-2025.9.1 multitasking-0.0.13 narwhals-2.24.0 numpy-2.4.6 openpyxl-3.1.5 packaging-26.3 pandas-3.0.3 peewee-4.3.0 pillow-12.3.0 platformdirs-4.11.1 plotly-6.7.0 pluggy-1.6.0 protobuf-7.35.1 pyarrow-25.0.0 pycparser-3.0 pydantic-2.13.4 pydantic-core-2.46.4 pydeck-0.9.3 pygments-2.20.0 pypdf-6.14.2 pytest-9.0.2 python-dateutil-2.9.0.post0 python-multipart-0.0.32 pytz-2026.3.post1 referencing-0.37.0 requests-2.34.2 rpds-py-2026.6.3 ruff-0.15.13 six-1.17.0 smmap-5.0.3 soupsieve-2.9.2 starlette-1.6.0 streamlit-1.57.0 tenacity-9.1.4 toml-0.10.2 typing-extensions-4.16.0 typing-inspection-0.4.2 urllib3-2.7.0 uvicorn-0.47.0 watchdog-6.0.0 websockets-17.0.1 xlrd-2.0.2 yfinance-1.3.0
2026-08-08T19:20:00.0984573Z 
2026-08-08T19:20:00.0984802Z [notice] A new release of pip is available: 26.1.2 -> 26.2.1
2026-08-08T19:20:00.0985272Z [notice] To update, run: pip install --upgrade pip
2026-08-08T19:20:00.3093388Z ##[group]Run set -euo pipefail
2026-08-08T19:20:00.3093674Z [36;1mset -euo pipefail[0m
2026-08-08T19:20:00.3093934Z [36;1mmkdir -p /tmp/financemanager-phase3-backend/runtime[0m
2026-08-08T19:20:00.3094331Z [36;1mpython -m pytest tests -q | tee /tmp/financemanager-phase3-backend/pytest.log[0m
2026-08-08T19:20:00.3094876Z [36;1mpassed_count=$(sed -nE 's/.*(^|[^0-9])([0-9]+) passed.*/\2/p' /tmp/financemanager-phase3-backend/pytest.log | tail -n 1)[0m
2026-08-08T19:20:00.3095296Z [36;1mtest -n "${passed_count}"[0m
2026-08-08T19:20:00.3096057Z [36;1mtest "${passed_count}" -ge 667[0m
2026-08-08T19:20:00.3136377Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-08-08T19:20:00.3136655Z env:
2026-08-08T19:20:00.3136822Z   PYTHONPATH: src
2026-08-08T19:20:00.3137012Z   JARVIS_FINANCE_ENV: test
2026-08-08T19:20:00.3137301Z   JARVIS_FINANCE_DB_PATH: /tmp/financemanager-phase3-backend/finance.sqlite3
2026-08-08T19:20:00.3137869Z   JARVIS_FINANCE_RUNTIME_DIR: /tmp/financemanager-phase3-backend/runtime
2026-08-08T19:20:00.3138255Z   JARVIS_FINANCE_WRITE_MODE: disabled
2026-08-08T19:20:00.3138522Z   pythonLocation: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:20:00.3138850Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.11.15/x64/lib/pkgconfig
2026-08-08T19:20:00.3139178Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:20:00.3139479Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:20:00.3139780Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.15/x64
2026-08-08T19:20:00.3140088Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.15/x64/lib
2026-08-08T19:20:00.3140341Z ##[endgroup]
2026-08-08T19:20:15.7226029Z ........................................................................ [  7%]
2026-08-08T19:20:25.7698753Z ........................................................................ [ 14%]
2026-08-08T19:20:35.5819226Z ........................................................................ [ 21%]
2026-08-08T19:20:47.7936877Z ........................................................................ [ 28%]
2026-08-08T19:20:58.1066928Z ........................................................................ [ 35%]
2026-08-08T19:21:06.6843275Z ........................................................................ [ 43%]
2026-08-08T19:21:15.2322635Z ........................................................................ [ 50%]
2026-08-08T19:21:30.5036397Z ........................................................................ [ 57%]
2026-08-08T19:21:41.1991909Z ........................................................................ [ 64%]
2026-08-08T19:22:01.7938138Z ........................................................................ [ 71%]
2026-08-08T19:22:24.3609904Z ........................................................................ [ 78%]
2026-08-08T19:22:36.0479267Z ........................................................................ [ 86%]
2026-08-08T19:22:52.8206939Z ..FF.................................................................... [ 93%]
2026-08-08T19:23:04.1556420Z ....................................................................     [100%]
2026-08-08T19:23:04.1557036Z =================================== FAILURES ===================================
2026-08-08T19:23:04.1557954Z _ test_confirm_is_fingerprint_bound_idempotent_audited_and_does_not_activate_rule _
2026-08-08T19:23:04.1558684Z 
2026-08-08T19:23:04.1559212Z     def test_confirm_is_fingerprint_bound_idempotent_audited_and_does_not_activate_rule():
2026-08-08T19:23:04.1559934Z         conn = database()
2026-08-08T19:23:04.1560417Z         add_bank_row(conn, "bank-1", "2026-01-30", "600")
2026-08-08T19:23:04.1560941Z         result = preview(conn)
2026-08-08T19:23:04.1561386Z         request = confirmation_request(result)
2026-08-08T19:23:04.1561828Z     
2026-08-08T19:23:04.1562263Z         confirmed = confirm_truewealth_bank_payments(conn, request)
2026-08-08T19:23:04.1563214Z         repeated = confirm_truewealth_bank_payments(conn, request)
2026-08-08T19:23:04.1563880Z         altered_replay = {**request, "recipient_name": "Different Recipient"}
2026-08-08T19:23:04.1564426Z     
2026-08-08T19:23:04.1564806Z         assert confirmed["written_cashflows"] == 1
2026-08-08T19:23:04.1565308Z         assert confirmed["rule_activated"] is False
2026-08-08T19:23:04.1566006Z         assert repeated["idempotent"] is True
2026-08-08T19:23:04.1566646Z         with pytest.raises(ValueError, match="already used with a different payload"):
2026-08-08T19:23:04.1567564Z             confirm_truewealth_bank_payments(conn, altered_replay)
2026-08-08T19:23:04.1568210Z         TrueWealthBankPaymentConfirmResponse.model_validate(confirmed)
2026-08-08T19:23:04.1568908Z         TrueWealthBankPaymentConfirmResponse.model_validate(repeated)
2026-08-08T19:23:04.1569842Z         assert conn.execute("SELECT COUNT(*) FROM transactions WHERE source_type='truewealth_raiffeisen_cashflow_v1'").fetchone()[0] == 1
2026-08-08T19:23:04.1570929Z         assert conn.execute("SELECT COUNT(*) FROM audit_log WHERE action='recipient_rule_activated'").fetchone()[0] == 0
2026-08-08T19:23:04.1571843Z         assert conn.execute("SELECT COUNT(*) FROM performance_cashflow_coverage").fetchone()[0] == 0
2026-08-08T19:23:04.1572502Z         audit_payload = conn.execute(
2026-08-08T19:23:04.1573129Z             "SELECT new_values_json FROM audit_log WHERE action='recipient_rule_and_history_confirmed'"
2026-08-08T19:23:04.1573785Z         ).fetchone()[0]
2026-08-08T19:23:04.1574201Z         assert "Dauerauftrag" not in audit_payload
2026-08-08T19:23:04.1574717Z         assert ATTESTATION not in audit_payload
2026-08-08T19:23:04.1575210Z         assert '"description"' not in audit_payload
2026-08-08T19:23:04.1576240Z         assert conn.execute("SELECT transaction_type FROM budget_transactions WHERE budget_transaction_id='bank-1'").fetchone()[0] == "transfer"
2026-08-08T19:23:04.1577499Z         activity = load_scope_activities(conn, account_ids=["tw-total"], to_date="2026-07-31", data_cutoff="2026-08-04T00:00:00+00:00")
2026-08-08T19:23:04.1578399Z >       assert [(row.kind, str(row.net)) for row in activity] == [("external_deposit", "600")]
2026-08-08T19:23:04.1579076Z E       AssertionError: assert [] == [('external_deposit', '600')]
2026-08-08T19:23:04.1579576Z E         
2026-08-08T19:23:04.1580006Z E         Right contains one more item: ('external_deposit', '600')
2026-08-08T19:23:04.1580510Z E         
2026-08-08T19:23:04.1580846Z E         Full diff:
2026-08-08T19:23:04.1581196Z E         + []
2026-08-08T19:23:04.1581552Z E         - [
2026-08-08T19:23:04.1581898Z E         -     (
2026-08-08T19:23:04.1582266Z E         -         'external_deposit',
2026-08-08T19:23:04.1582697Z E         -         '600',
2026-08-08T19:23:04.1583078Z E         -     ),
2026-08-08T19:23:04.1583422Z E         - ]
2026-08-08T19:23:04.1583678Z 
2026-08-08T19:23:04.1584044Z tests/unit/test_sprint20d_truewealth_productization.py:477: AssertionError
2026-08-08T19:23:04.1584878Z _ test_confirmed_payment_enters_canonical_ttwror_and_xirr_only_after_separate_coverage _
2026-08-08T19:23:04.1585778Z 
2026-08-08T19:23:04.1586219Z     def test_confirmed_payment_enters_canonical_ttwror_and_xirr_only_after_separate_coverage():
2026-08-08T19:23:04.1586872Z         conn = database()
2026-08-08T19:23:04.1587291Z         add_bank_row(conn, "bank-1", "2026-01-30", "600")
2026-08-08T19:23:04.1587778Z         bank_preview = preview(conn)
2026-08-08T19:23:04.1588348Z         confirm_truewealth_bank_payments(conn, confirmation_request(bank_preview))
2026-08-08T19:23:04.1588963Z         for snapshot_id, day, value in (
2026-08-08T19:23:04.1589407Z             ("open", "2026-01-01", "1000"),
2026-08-08T19:23:04.1589842Z             ("flow", "2026-01-30", "1600"),
2026-08-08T19:23:04.1590277Z             ("close", "2026-07-31", "1800"),
2026-08-08T19:23:04.1590701Z         ):
2026-08-08T19:23:04.1591047Z             conn.execute(
2026-08-08T19:23:04.1592223Z                 """INSERT INTO account_value_snapshots(snapshot_id,account_id,valuation_date,total_value_chf,currency,source_type,quality_status,created_at,source_reference,is_active)
2026-08-08T19:23:04.1593288Z                    VALUES(?,?,?,?,'CHF','truewealth_official_import','ok',?,?,1)""",
2026-08-08T19:23:04.1593903Z                 (snapshot_id, "tw-total", day, value, NOW, snapshot_id),
2026-08-08T19:23:04.1594406Z             )
2026-08-08T19:23:04.1594772Z         refreshed_bank_preview = preview(conn)
2026-08-08T19:23:04.1595342Z         activation_preview = build_truewealth_activation_performance_preview(
2026-08-08T19:23:04.1596302Z             conn,
2026-08-08T19:23:04.1596690Z             bank_preview=refreshed_bank_preview,
2026-08-08T19:23:04.1597290Z             period_from="2026-01-01",
2026-08-08T19:23:04.1597766Z             period_to="2026-07-31",
2026-08-08T19:23:04.1598157Z         )
2026-08-08T19:23:04.1598577Z         assert refreshed_bank_preview["counts"]["existing"] == 1
2026-08-08T19:23:04.1599188Z         assert refreshed_bank_preview["cashflows_to_write"] == []
2026-08-08T19:23:04.1599840Z         assert Decimal(activation_preview["deposit_total_chf"]) == Decimal(600)
2026-08-08T19:23:04.1600458Z         assert len(activation_preview["deposits"]) == 1
2026-08-08T19:23:04.1600938Z         set_performance_cashflow_coverage(
2026-08-08T19:23:04.1601439Z             conn,
2026-08-08T19:23:04.1601801Z             account_id="tw-total",
2026-08-08T19:23:04.1602233Z             coverage_from="2026-01-01",
2026-08-08T19:23:04.1602659Z             coverage_to="2026-07-31",
2026-08-08T19:23:04.1603094Z             status="complete",
2026-08-08T19:23:04.1603512Z             source="explicit_test_attestation",
2026-08-08T19:23:04.1604114Z             note="All external cashflows independently attested for this test period.",
2026-08-08T19:23:04.1604725Z             recorded_at=NOW,
2026-08-08T19:23:04.1605105Z         )
2026-08-08T19:23:04.1605446Z         conn.commit()
2026-08-08T19:23:04.1605946Z     
2026-08-08T19:23:04.1606328Z         performance = build_portfolio_performance(
2026-08-08T19:23:04.1606776Z             conn,
2026-08-08T19:23:04.1607128Z             from_date="2026-01-01",
2026-08-08T19:23:04.1607545Z             to_date="2026-07-31",
2026-08-08T19:23:04.1607958Z             account_id="tw-total",
2026-08-08T19:23:04.1608391Z             data_cutoff="2026-08-04T00:00:00+00:00",
2026-08-08T19:23:04.1608822Z         )
2026-08-08T19:23:04.1609146Z     
2026-08-08T19:23:04.1609543Z         summary = cast(dict[str, Any], performance["summary"])
2026-08-08T19:23:04.1610134Z         quality = cast(dict[str, dict[str, Any]], performance["quality"])
2026-08-08T19:23:04.1610791Z >       assert Decimal(str(summary["net_external_cashflows"])) == Decimal(600)
2026-08-08T19:23:04.1611415Z E       AssertionError: assert Decimal('0') == Decimal('600')
2026-08-08T19:23:04.1611921Z E        +  where Decimal('0') = Decimal('0')
2026-08-08T19:23:04.1612368Z E        +    where '0' = str('0')
2026-08-08T19:23:04.1612808Z E        +  and   Decimal('600') = Decimal(600)
2026-08-08T19:23:04.1613155Z 
2026-08-08T19:23:04.1613524Z tests/unit/test_sprint20d_truewealth_productization.py:539: AssertionError
2026-08-08T19:23:04.1614168Z =============================== warnings summary ===============================
2026-08-08T19:23:04.1614904Z ../../../../../opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/fastapi/testclient.py:1
2026-08-08T19:23:04.1616360Z   /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
2026-08-08T19:23:04.1617605Z     from starlette.testclient import TestClient as TestClient  # noqa
2026-08-08T19:23:04.1618052Z 
2026-08-08T19:23:04.1618426Z -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
2026-08-08T19:23:04.1619076Z =========================== short test summary info ============================
2026-08-08T19:23:04.1620588Z FAILED tests/unit/test_sprint20d_truewealth_productization.py::test_confirm_is_fingerprint_bound_idempotent_audited_and_does_not_activate_rule - AssertionError: assert [] == [('external_deposit', '600')]
2026-08-08T19:23:04.1621695Z   
2026-08-08T19:23:04.1622110Z   Right contains one more item: ('external_deposit', '600')
2026-08-08T19:23:04.1622592Z   
2026-08-08T19:23:04.1622919Z   Full diff:
2026-08-08T19:23:04.1623279Z   + []
2026-08-08T19:23:04.1623598Z   - [
2026-08-08T19:23:04.1623923Z   -     (
2026-08-08T19:23:04.1624266Z   -         'external_deposit',
2026-08-08T19:23:04.1624824Z   -         '600',
2026-08-08T19:23:04.1625163Z   -     ),
2026-08-08T19:23:04.1625487Z   - ]
2026-08-08T19:23:04.1626617Z FAILED tests/unit/test_sprint20d_truewealth_productization.py::test_confirmed_payment_enters_canonical_ttwror_and_xirr_only_after_separate_coverage - AssertionError: assert Decimal('0') == Decimal('600')
2026-08-08T19:23:04.1627706Z  +  where Decimal('0') = Decimal('0')
2026-08-08T19:23:04.1628130Z  +    where '0' = str('0')
2026-08-08T19:23:04.1628536Z  +  and   Decimal('600') = Decimal(600)
2026-08-08T19:23:04.1629000Z 2 failed, 1002 passed, 1 warning in 181.93s (0:03:01)
2026-08-08T19:23:04.6296839Z ##[error]Process completed with exit code 1.
2026-08-08T19:23:04.6411925Z Node 20 is being deprecated. This workflow is running with Node 24 by default. If you need to temporarily use Node 20, you can set the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true environment variable. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
2026-08-08T19:23:04.6412868Z Post job cleanup.
2026-08-08T19:23:04.7182503Z [command]/usr/bin/git version
2026-08-08T19:23:04.7257338Z git version 2.54.0
2026-08-08T19:23:04.7328038Z Temporarily overriding HOME='/home/runner/work/_temp/c19b0117-152b-41e5-bd4c-595b110c78ed' before making global git config changes
2026-08-08T19:23:04.7329308Z Adding repository directory to the temporary git global config as a safe directory
2026-08-08T19:23:04.7330225Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/FinanceManager/FinanceManager
2026-08-08T19:23:04.7418778Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-08-08T19:23:04.7457503Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2026-08-08T19:23:04.7831774Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
2026-08-08T19:23:04.7876374Z http.https://github.com/.extraheader
2026-08-08T19:23:04.7906563Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
2026-08-08T19:23:04.7948680Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
2026-08-08T19:23:04.8267789Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
2026-08-08T19:23:04.8385727Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
2026-08-08T19:23:04.8719513Z Cleaning up orphan processes
2026-08-08T19:23:04.8979899Z ##[warning]Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-python@v5. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
